
CREATE TABLE CLIENTES ( 
  DNI VARCHAR2(8) NOT NULL PRIMARY KEY,
  NOMBRE VARCHAR2(32 BYTE) NOT NULL,
  APELLIDO VARCHAR2(32 BYTE) NOT NULL,
  DIRECCION VARCHAR2(40)NOT NULL,
  EMAIL VARCHAR2(40),
  CLAVE VARCHAR2(8 BYTE) NOT NULL); /*CLAVE PARA ENTRAR CON EL DNI A REALIZAR ACCIONES*/
INSERT INTO CLIENTES ("DNI", "NOMBRE", "APELLIDO", "DIRECCION", "EMAIL", "CLAVE") VALUES ('30462661', 'JO', 'RA', 'IN', 'OSEJU', 'JS');

CREATE TABLE CUENTAS (
  NRO_CUENTA NUMBER NOT NULL PRIMARY KEY,
  DNI VARCHAR2(8)NOT NULL REFERENCES CLIENTES(DNI), /*CREAR CLAVE FORANEA QUE APUNTE AL CAMPO DNI DE LA TABLA CLIENTE*/
  TIPO_CTA NUMBER(2,0) NOT NULL, /*(CC - CA)*/
  ESTADO NUMBER(1) NOT NULL, /*(1 = HAB - 0 = INA)*/
  SALDO NUMBER(16,2) NOT NULL,
  DESCUBIERTO NUMBER(16,2) NOT NULL);
  
INSERT INTO CUENTAS ("NRO_CUENTA", "DNI", "TIPO_CTA", "ESTADO", "SALDO", "DESCUBIERTO") VALUES (1, '30462661', 1, 1, 13, 15);
  

CREATE TABLE MOVIMIENTOS (
  ID_MOV NUMBER NOT NULL PRIMARY KEY, /*VER COMO CREAR LA SECUENCIA PARA HACER EL CAMPO AUTONUMERICO*/
  NRO_CUENTA VARCHAR2(20),
  FECHA DATE NOT NULL,
  TIPO_MOV VARCHAR2(3) NOT NULL, /*(EXT - DEP)*/
  ORIGEN VARCHAR2(3)NOT NULL, /*(CAJ - TRA - SER - PRE - PFJ)*/
  SALDO_ACTUAL NUMBER(16,2) NOT NULL, /*SALDO ANTERIOR AL MOVIMIENTO*/
  MONTO_MOV NUMBER(16,2)NOT NULL);
  
CREATE SEQUENCE MOVIMIENTOS_ID /* EJ DE USO: INSERT INTO MOVIMIENTOS VALUES (MOVIMIENTOS_ID.NEXTVAL, '20','1'); */
INCREMENT BY 1
START WITH 1
NOCYCLE
CACHE 20;

CREATE TABLE PLAZO_FIJO (
  ID_PFJ NUMBER NOT NULL PRIMARY KEY, /*VER COMO CREAR LA SECUENCIA PARA HACER EL CAMPO AUTONUMERICO*/
  DNI VARCHAR2(8) NOT NULL REFERENCES CLIENTES(DNI), /*CREAR CLAVE FORANEA QUE APUNTE AL CAMPO DNI DE LA TABLA CLIENTE*/
  FECHA_ALTA DATE NOT NULL,
  FECHA_VENCIMIENTO DATE NOT NULL,
  ORIGEN VARCHAR2(3) NOT NULL, /*(EFE - CTA)*/
  NRO_CTA_ORIGEN NUMBER,
  ACREDITACION VARCHAR2(3), /*(CTA - CJA)*/
  NRO_CTA_DESTINO NUMBER,
  MONTO NUMBER(16,2),
  INTERES VARCHAR2(3));
  
CREATE SEQUENCE PLAZO_FIJO_ID
INCREMENT BY 1
START WITH 1
NOCYCLE
CACHE 20;
  
CREATE TABLE TRANSFERENCIAS(
  ID_MOV NUMBER NOT NULL REFERENCES MOVIMIENTOS(ID_MOV) PRIMARY KEY, /*CLAVE FORANEA QUE APUNTE AL ID_MOV DE LA TABLA MOVIMIENTOS*/
  NRO_CTA_ORIGEN NUMBER NOT NULL REFERENCES CUENTAS(NRO_CUENTA), /*CLAVE FORANEA QUE APUNTE A NRO_CUENTA DE LA TABLA CUENTAS*/
  NRO_CTA_DESTINO NUMBER NOT NULL REFERENCES CUENTAS(NRO_CUENTA)); /*CLAVE FORANEA QUE APUNTE A NRO_CUENTA DE LA TABLA CUENTAS*/

CREATE TABLE SERVICIOS(
  ID_SERV VARCHAR2(3) NOT NULL PRIMARY KEY, /*SECUENCIA*/
  DESCRIPCION VARCHAR2(15) NOT NULL,
  MONTO_FIJO NUMBER(16,2));

CREATE SEQUENCE SERVICIOS_ID
INCREMENT BY 1
START WITH 1
NOCYCLE
CACHE 20;



CREATE TABLE PRESTAMOS(
  ID_PRESTAMO NUMBER NOT NULL PRIMARY KEY, /*CREAR SECUENCIA*/
  DNI VARCHAR2(8) NOT NULL REFERENCES CLIENTES(DNI), /*CLAVE FORANEA CON DNI TABLA CLIENTE*/
  NRO_CUENTA VARCHAR2(20),
  FECHA_ALTA DATE NOT NULL,
  MONTO NUMBER(16,2) NOT NULL,
  CANT_CUOTAS VARCHAR2(3) NOT NULL,
  INTERES VARCHAR2(3) NOT NULL);

CREATE SEQUENCE PRESTAMOS_ID
INCREMENT BY 1
START WITH 1
NOCYCLE
CACHE 20;


CREATE TABLE PAGO_SERVICIOS(
  ID_MOV NUMBER NOT NULL PRIMARY KEY REFERENCES MOVIMIENTOS(ID_MOV), /*CLAVE FORANEA CON MOVIMIENTOS*/
  ID_SERV VARCHAR(3) NOT NULL REFERENCES SERVICIOS(ID_SERV), /*CLAVE FORANEA CON SERVICIOS*/
  FECHA DATE NOT NULL,
  NRO_CUENTA NUMBER NOT NULL REFERENCES CUENTAS(NRO_CUENTA)); /*CLAVE FORANEA CON CUENTAS*/


CREATE TABLE PAGO_PRESTAMOS(
  ID_PAGO NUMBER NOT NULL PRIMARY KEY, /*SECUENCIA*/
  ID_PRESTAMO NUMBER NOT NULL REFERENCES PRESTAMOS(ID_PRESTAMO), /*CLAVE FORANEA CON PRESTAMOS*/
  ID_MOV NUMBER,
  FECHA_PAGO DATE,
  ORIGEN VARCHAR2(3) NOT NULL, /*(EFE - CTA)*/
  NRO_CUENTA VARCHAR2(20));

CREATE SEQUENCE PAGO_PRESTAMOS_ID
INCREMENT BY 1
START WITH 1
NOCYCLE
CACHE 20;

CREATE SEQUENCE S_CUENTAS
INCREMENT BY 1
START WITH 1
NOCYCLE
CACHE 20;

/*
 * Packages
 */
  CREATE OR REPLACE PACKAGE ERRORES AS 

  MAXIMO_CUENTAS EXCEPTION;

  END ERRORES;

/

/* 
 * SE GENERAN LAS AUTO INCREMENTABLE PARA LAS TABLAS
 */

create or replace trigger AI_CUENTAS     
	before insert on CUENTAS  for each row begin
		if inserting then       if :NEW."NRO_CUENTA" is null then
			select S_CUENTAS.nextval into :NEW."NRO_CUENTA" from dual;
		end if;
	end if;
end;
/


CREATE OR REPLACE TRIGGER "AI_MOVIMIENTOS" 
	before insert on "MOVIMIENTOS" for each row 
	begin     
		if inserting then
			if :NEW."ID_MOV" is null then
				select MOVIMIENTOS_ID.nextval into :NEW."ID_MOV" from dual;
			end if;
		end if;
	end;
/
 

CREATE OR REPLACE TRIGGER "AI_PLAZO_FIJO" 
  before insert on "PLAZO_FIJO" for each row 
  begin     
	  if inserting then
	  	if :NEW."ID_PFJ" is null then
	  		select PLAZO_FIJO_ID.nextval into :NEW."ID_PFJ" from dual;
  		end if;
  	  end if;
  end;
/
 

  CREATE OR REPLACE TRIGGER "AI_PRESTAMOS"
  before insert on "PRESTAMOS" for each row
  	begin
	  	if inserting then
	  		if :NEW."ID_PRESTAMO" is null then
	  			select PRESTAMOS_ID.nextval into :NEW."ID_PRESTAMO" from dual;
	  		end if;
  		end if;
  	end;
/


  CREATE OR REPLACE TRIGGER "AI_SERVICIOS"
  before insert on "SERVICIOS" for each row begin
	  if inserting then
		  if :NEW."ID_SERV" is null then
		  	select SERVICIOS_ID.nextval into :NEW."ID_SERV" from dual;
		  end if;
	  end if;
  end;
/
 
/*
 * Disparadores
 */
  CREATE OR REPLACE TRIGGER "UTN_LABV"."MAXIMO_DE_CUENTAS" 
BEFORE INSERT ON CUENTAS REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

DECLARE
cant NUMBER(5);
BEGIN
  SELECT count(1)
  INTO cant
  FROM CUENTAS
  WHERE TIPO_CTA = :NEW.TIPO_CTA AND DNI = :NEW.DNI;
  
  if (:NEW.TIPO_CTA = 1 AND cant = 1 ) OR (:NEW.TIPO_CTA = 2 AND cant >= 5)THEN
    RAISE ERRORES.MAXIMO_CUENTAS;
  END IF;
    
END;
/
ALTER TRIGGER "UTN_LABV"."MAXIMO_DE_CUENTAS" ENABLE;

